1-TANIMLAYICI İSTATİSTİKLER


VERI

cars=read_excel("C:/Users/Tarık/Desktop/Ders Notlarım/4. Sınıf/1. Dönem/Çok Değişkenli İstatistiksel Analiz/FİNAL/car_consumption.xls")

Bagimli Degisken :

  • Price: Arabanin fiyati

Aciklayici Degiskenler:

  • Cylinder: Arabanin silindir hacmi

  • Power: Arabanin gucu (beygiri)

  • Weight: Arabanin agirligi

  • Consumption: Yakit tuketimi

  • Gozlem Sayisi: 27

  • Aciklayici Degisken Sayisi: 4

cars1=cars %>% add_row(Model = "Peugeot 5008", Price = 179340, Cylinder = 6400, Power = 321, Weight = 5200, Consumption = 30.8) %>% 
               add_row(Model = "Ford Mustang", Price = 245250, Cylinder = 8500, Power = 457, Weight = 5100, Consumption = 50.1) %>% 
               add_row(Model = "Audi A5"     , Price = 52200 , Weight = 1200  , Consumption = 8.5) %>% 
               add_row(Model = "Mercedes E250",Price = 245250, Power = 102)
  • 2. ve 3. kısımda calismaya uygun hale getirmek icin asiri ve eksik gozlemler iceren yeni satirlar eklendi. Daha sonra kullanilacak.

Verinin şu anki hali


profiling_num(cars)
##      variable        mean      std_dev variation_coef      p_01     p_05
## 1       Price 28260.55556 12602.070826      0.4459244 10749.000 11867.00
## 2    Cylinder  1802.07407   634.420506      0.3520502   706.880   861.90
## 3       Power    78.14815    32.788018      0.4195623    29.780    32.00
## 4      Weight  1193.14815   314.205800      0.2633418   670.800   733.00
## 5 Consumption     9.12963     2.256242      0.2471340     5.726     5.89
##       p_25    p_50     p_75     p_95      p_99   skewness kurtosis     iqr
## 1 19615.00 25000.0 36775.00 50350.00 50874.000 0.40606425 2.003413 17160.0
## 2  1360.50  1983.0  2300.00  2819.70  2968.360 0.05348860 2.142632   939.5
## 3    54.50    85.0    99.00   125.00   143.500 0.20145571 2.263197    44.5
## 4   982.50  1140.0  1450.00  1659.50  1766.200 0.15874223 2.092423   467.5
## 5     6.95     9.2    11.05    12.46    12.774 0.02801713 1.689807     4.1
##            range_98        range_80
## 1    [10749, 50874]  [13234, 48340]
## 2 [706.88, 2968.36] [955.4, 2496.4]
## 3    [29.78, 143.5]   [32.6, 123.2]
## 4   [670.8, 1766.2]     [770, 1596]
## 5   [5.726, 12.774]   [6.34, 11.78]
  • Profiling_num komutu ile degiskenlerin ortalama, standart sapma, medyan vb. tanimlayici istatistikleri ozetlendi.

  • Bu grafik ile verideki bütün araba modellerinin fiyatlarini gorebiliyoruz.

  • Arabanin fiyat, beygir ve silindir degiskenleriyle 3 boyutlu sacilim grafigi cizdirildi. Beygir ve silindirin artmasi fiyati da arttiriyor.

  • Degiskenler arasi iliski grafikleri cizdirildi, dogrusal ve pozitif iliskiler gozukuyor. Detayli olarak 5. kisimda bakilacak.

  • Bu grafige bakildiginda yakit ve fiyat arasinda lineer pozitif bir iliski var. Ayni zamanda agirlik arttikca yakit ve fiyatin da arttigi goruluyor.

  • Bazi silindir degerlerine gore fiyat degiskeni kutu grafigi cizildi. Sacilim grafinde yapilan yorumlar burda da gecerlidir.

2-EKSİK GÖZLEMLER


3 tane eksik gozlem cesidi vardir. Bunlar;

1- Ortalama ile Doldurma

apply(cars1,2,function(x) sum(is.na(x)))
##       Model       Price    Cylinder       Power      Weight Consumption 
##           0           0           2           1           1           1

Bu komut ile hangi degiskenlerde kac tane eksik gozlem oldugunu gorebiliyoruz. Cylinder degiskeninde 2 tane eksik gozlem var. Bunlari ortalama ile dolduralim.

cars1$Cylinder=impute(cars1$Cylinder, mean)
tail(cars1)
## # A tibble: 6 x 6
##   Model                Price Cylinder Power Weight Consumption
##   <chr>                <dbl> <impute> <dbl>  <dbl>       <dbl>
## 1 Toyota Previa salon  50900 2438.000    97   1800        12.8
## 2 Volvo 960 Kombi aut  49300 2473.000   125   1570        12.7
## 3 Peugeot 5008        179340 6400.000   321   5200        30.8
## 4 Ford Mustang        245250 8500.000   457   5100        50.1
## 5 Audi A5              52200 2191.586    NA   1200         8.5
## 6 Mercedes E250       245250 2191.586   102     NA        NA

Eksik gozlemlere tekrar bakalim.

apply(cars1,2,function(x) sum(is.na(x)))
##       Model       Price    Cylinder       Power      Weight Consumption 
##           0           0           0           1           1           1
tail(cars1$Cylinder)
##        26        27        28        29        30        31 
##  2438.000  2473.000  6400.000  8500.000 2191.586* 2191.586*

Goruldugu uzere Cylinder degiskenindeki eksik gozlemler ortalama ile doldurulmustur. (30 ve 31. gozlem)

  • +Veri boyutu kucuk oldugunda bu daha iyi bir yaklasimdir.

  • -Yanliligi ve hata performansini arttirir.


2- Eksik Gozlem Olan Satiri Silmek

cars1=na.omit(cars1)

Bu kod ile eksik gozlem iceren satir direkt olarak veriden siliniyor.

apply(cars1,2,function(x) sum(is.na(x)))
##       Model       Price    Cylinder       Power      Weight Consumption 
##           0           0           0           0           0           0
dim(cars1)
## [1] 29  6

Goruldugu uzere veride eksik gozlem kalmamistir ancak 31 gozlemden 29 gozleme dusmus oldu. Eksik gozlem iceren satirlar silindi.

  • +Eksik degerlere sahip verilerin tamamen kaldirilmasi, saglam ve yuksek dogrulukta analiz saglar.

  • -Bilgi ve veri kaybi olusturur.

Bu yontemin benim verim icin gayet mantikli oldugunu dusunuyorum cunku 31 gozlemde 2 tanesinin eksik olmasi %6’lik bir kisma denk geliyor. Bu kadar az bir kismi silmek analizi cok fazla etkilemeyecektir.


3- Regresyon Modeli ile Doldurma

cars1$Cylinder[31]
## [1] NA

Cylinder degiskeninin 31. gozlemi eksik gozlem gozukuyor.

model=lm(Cylinder~Power, data=cars1)
summary(model)
## 
## Call:
## lm(formula = Cylinder ~ Power, data = cars1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -310.61 -131.60  -15.33   56.35  646.26 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 389.5737    53.7637   7.246 8.57e-08 ***
## Power        18.0950     0.4075  44.402  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 189.9 on 27 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.9865, Adjusted R-squared:  0.986 
## F-statistic:  1972 on 1 and 27 DF,  p-value: < 2.2e-16

Cylinder ile Power degiskeni icin regresyon modeli kuruyoruz. Regresyon denklemimiz y=389.5737+18.0950.x oldu. Simdi bu gozlemi denklem sayesinde doldurabiliriz.

gosterge=function(t){x=dim(length(t))
                     x[which(!is.na(t))]=1
                     x[which(is.na(t))]=0
                     return(x)}
cars1$durum=gosterge(cars1$Cylinder)
for(i in 1:nrow(cars1))
{if(cars1$durum[i]==0)
{cars1$Cylinder[i]=389.5737+18.0950*cars1$Power[i]}}
cars1$Cylinder[31]
## [1] 2235.264

Goruldugu uzere regresyon denklemi ile eksik olan gozlem yerine deger eklemis olduk.

  • +Model parametrelerinin tarafsiz tahminlerini verir.

  • -Varyans ve korelasyona dayali analizler uzerinde yanlilik yaratir.


3-AŞIRI GÖZLEMLER


Veride outliers olmadigini bildigim icin kendi ekledigim haliyle calisacagim.

Oncelikle eksik gozlemleri cikariyorum.

cars1=na.omit(cars1)

Aykiri Gozlemleri Belirleme

  • Butun degiskenlerin kutu grafigini cizdirdigimizde hepsinde iki tane degerin medyanin ve max degerlerin cok uzerinde oldugu gozukuyor. Bu degerlerin bizim ekledigimiz iki deger oldugunu biliyoruz ancak normalde boyle bir durum oldugunda asiri deger oldugundan suphelenmemiz gerekiyor.

  • Ayni sekilde fiyat degiskenine gore diger degiskenlerin sacilim grafigini cizdirdigimizde iki ayri degerin aykiri oldugu cok acik gozukuyor.

## Remove outliers with left-click, stop with right-click on plotting device
## $outliers
## NULL
  • Chi Square ile cizilen grafikte bir degerin aykiri gozlem oldugunu gosteriyor. Biz iki aykiri gozlemle calistigimizi dusunuyorduk. Bu durum bir outlierin digerini gizlemesi olabilir.

Regresyon modeli kurup model uzerinden bakalim.

model=lm(Price~Cylinder+Power+Weight+Consumption,data=cars1)
  
outlierTest(model)
## No Studentized residuals with Bonferroni p < 0.05
## Largest |rstudent|:
##    rstudent unadjusted p-value Bonferroni p
## 29 2.741435           0.011629      0.33725
  • Bonferroni outlier test sonucuna gore 29. gozlem aykiri cikmistir.
hatv=hatvalues(model)
halfnorm(hatv,2,ylab="outliers")

  • Modelin sapka degerleri ile cizdirdigimiz bu grafik bize 28 ve 29. gozlemlerin asiri gozlem oldugunu gosteriyor.

Sonuc olarak kullandigimiz yontemler sonucunda asiri gozlemleri tespit edip veriye nasil bir etkisi oldugunu gorebiliyoruz


Aykiri Gozlemler icin Cozum Yontemleri


1- Aykiri Gozlemleri Cikarmak

Aykiri gozlemlerin olmadigi veri seti bizde tanimli olarak kullanima hazir.

Goruldugu uzere aykiri gozlemler veriden cikinca saglikli grafiklerle karsilasiyoruz.


  • Sacilim grafiklerinden beygir ve fiyat olani secip aykiri gozlemleri cikardigimizda grafigin nasil degisecegine bakalim.

  • Lineer bir artis oldugu icin aykiri gozlemler cizgiyi etkilemiyor. Aslinda bu tur gozlemlere leverage denebilir.

2- Aykiri Gozlemleri Ortalama ile Doldurmak

boxplot(cars1$Price,col="green")

Goruldugu uzere fiyat degiskeninde asiri gozlemler var. Bunlari ortalama ile dolduralim.

a=which(cars1$Price %in% boxplot.stats(cars1$Price)$out)
cars1[a, ]$Price
## [1] 179340 245250

Aykiri gozlemleri elde etmis olduk.

cars1[a, ]$Price=mean(cars1$Price)
boxplot(cars1$Price,col="green")

Ortalama ile doldurup kutu grafigine tekrar baktigimizda aykiri gozlemsiz bir grafik elde etmis olduk. Ayni islemler diger degiskenlere de yapilip butun aykiri gozlemler duzeltilebilir.


3- Aykiri Gozlemleri Baskilamak

Bu yontemin mantigi aykiri gozlemleri verinin 3. ceyreklik degeri ile degistirmektir. Bunu uygulayalim.

a=which(cars1$Price %in% boxplot.stats(cars1$Price)$out)
cars1[a, ]$Price=fivenum(cars1$Price)[4]
tail(cars1)
## # A tibble: 6 x 5
##   Price Cylinder Power Weight Consumption
##   <dbl>    <dbl> <dbl>  <dbl>       <dbl>
## 1 26950     1997    92   1240         9.2
## 2 36400     1984    85   1635        11.6
## 3 50900     2438    97   1800        12.8
## 4 49300     2473   125   1570        12.7
## 5 38990     6400   321   5200        30.8
## 6 38990     8500   457   5100        50.1

Goruldugu uzere fiyat degiskeninin aykiri gozlem degerleri (5 ve 6. Price degeri) 3. ceyreklik degeri ile degistirildi. Ortalama ile degistirme yontemine cok benzer bir uygulama.


4- Logaritmik Donusum

Bu yontem asiri saga carpik dagilimlara uygulanmaktadir. Uygulanmasi kolay oldugu icin denememizi yapalim.

logcars=log(cars1)

Log donusumu ile yeni bir veri seti olusturduk. Kutu grafiklerinde duzelme var mi bakalim.

Goruldugu uzere aykiri degerler hala bulunuyor. Log donusumu yontemi bu veri icin calismadi.


5-6 Karekok ve Ters Donusum

Log donusumu harici iki farkli donusum yontemimiz daha var. Bunlari da deneyelim.

  • Karekok Donusumu: Logaritma donusumu gibi dagilimin saga carpik oldugu durumlarda kullanilir. Bu yuzden bu yonteminde ise yarayacagini dusunmuyorum.

  • Ters Donusum: Asiri carpiklik durumunda kullanilir.

karecars=sqrt(cars1)
terscars=1/(cars1)
par(mfrow=c(1,2))
boxplot(karecars$Price, main="Karekok Donusumu",ylab="Fiyat", col="orange")
boxplot(terscars$Price, main="Ters Donusum",ylab="Fiyat", col="red")

  • Ongoruldugu uzere karekok donusumu aykiri gozlemlerle bas etmek konusunda yeterli olmadi.

  • Ters donusum ise iki aykiri gozlemden birini duzeltmeyi basardi. Ancak hala bir tane aykiri gozlem var.


4-DAĞILIMI İNCELEMEK


cars2=cars[,-1]


mvnorm.etest(cars2,R=10)
## 
##  Energy test of multivariate normality: estimated parameters
## 
## data:  x, sample size 27, dimension 5, replicates 10
## E-statistic = 1.3004, p-value < 2.2e-16
mvnorm.etest(cars2,R=100)
## 
##  Energy test of multivariate normality: estimated parameters
## 
## data:  x, sample size 27, dimension 5, replicates 100
## E-statistic = 1.3004, p-value = 0.03
mvnorm.etest(cars2,R=1000)
## 
##  Energy test of multivariate normality: estimated parameters
## 
## data:  x, sample size 27, dimension 5, replicates 1000
## E-statistic = 1.3004, p-value = 0.021
mshapiro.test(t(cars2))
## 
##  Shapiro-Wilk normality test
## 
## data:  Z
## W = 0.83948, p-value = 0.0007182

Price degiskenine log donusumu yaptigimizda normallige katkisinin olup olmadigini gorecegiz.

cars2$Price = log(cars2$Price)
plotNormalHistogram(cars2$Price)

mshapiro.test(t(cars2))
## 
##  Shapiro-Wilk normality test
## 
## data:  Z
## W = 0.84265, p-value = 0.0008269

5-DEĞİŞKEN İLİŞKİLERİ


pairs.panels(cars2, scale=TRUE)


Coklu baglanti problemini incelemek icin regresyon modelini kurup VIF degerlerini incelememiz gerekiyor.

model=lm(Price~Cylinder+Power+Weight+Consumption,data=cars)
vif(model)
##    Cylinder       Power      Weight Consumption 
##   14.491135   12.044308    9.426833   13.832198